package com.qijian.maindata.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qijian.common.utils.mybatis.WhereEntityTool;
import com.qijian.maindata.domain.ProductAttributeItem;
import com.qijian.maindata.domain.ProductAttributeItemDetail;
import com.qijian.maindata.domain.query.ProductAttributeItemDetailQuery;
import com.qijian.maindata.domain.query.ProductAttributeItemQuery;
import com.qijian.maindata.domain.vo.ProductAttributeItemValVo;
import com.qijian.maindata.mapper.ProductAttributeItemDetailMapper;
import com.qijian.maindata.mapper.ProductAttributeItemMapper;
import com.qijian.maindata.service.IProductAttributeItemService;
import com.qijian.maindata.service.IProductAttributeService;
import com.qijian.system.service.ISysDictTypeService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 辅助属性值Service业务层处理
 *
 * @author qijian
 * @date 2022-01-13
 */
@Service
@RequiredArgsConstructor
public class ProductAttributeItemServiceImpl extends ServiceImpl<ProductAttributeItemMapper, ProductAttributeItem> implements IProductAttributeItemService {

    private final ProductAttributeItemMapper productAttributeItemMapper;
    private final ProductAttributeItemDetailMapper productAttributeItemDetailMapper;
    private final IProductAttributeService productAttributeService;
    private final ISysDictTypeService dictTypeService;

    @Override
    public void saveUpdate(List<ProductAttributeItem> productAttributeItem) {

        Iterator<ProductAttributeItem> it = productAttributeItem.iterator();
        while (it.hasNext()) {
            ProductAttributeItem attributeItem = it.next();
            ProductAttributeItemQuery query = new ProductAttributeItemQuery();
            query.setItemId(attributeItem.getItemId());
            query.setAttrId(attributeItem.getAttrId());
            if (productAttributeItemMapper.selectCount(WhereEntityTool.invoke(query)) > 0) {
                it.remove();
            }
        }
        if (productAttributeItem.size() > 0)
            this.saveBatch(productAttributeItem);
    }

    @Override
    public List<ProductAttributeItem> getByItemId(Long itemId) {
        ProductAttributeItemQuery query = new ProductAttributeItemQuery();
        query.setItemId(itemId);
        query.setIsDisabled(false);
        return this.list(WhereEntityTool.invoke(query));
    }

    @Override
    public ProductAttributeItem getByItemIdAttrId(ProductAttributeItemQuery query) {
        return this.getOne(WhereEntityTool.invoke(query));
    }

    @Override
    public List<ProductAttributeItemValVo> pageWithValByItemId(Long itemId) {
        List<ProductAttributeItemValVo> result = new ArrayList<>();
        List<ProductAttributeItem> items = getByItemId(itemId);
        if (CollectionUtils.isEmpty(items))
            return result;
        ProductAttributeItemDetailQuery query = new ProductAttributeItemDetailQuery();
        query.setIsDisabled(false);
        query.setAttrItemIds(items.stream().map(ProductAttributeItem::getId).collect(Collectors.toSet()));
        List<ProductAttributeItemDetail> details = productAttributeItemDetailMapper.selectList(WhereEntityTool.invoke(query));
        Map<Long, List<ProductAttributeItemDetail>> mapDetails = details.stream().collect(Collectors.toMap(ProductAttributeItemDetail::getAttrItemId,
                a -> new ArrayList<>(Collections.singletonList(a)), (o, n) -> {
                    o.addAll(n);
                    return o;
                }));
        items.forEach(i -> {
            ProductAttributeItemValVo vo = new ProductAttributeItemValVo();
            BeanUtils.copyProperties(i, vo);
            if (mapDetails.get(i.getId()) != null)
                vo.setVals(mapDetails.get(i.getId()).stream().map(ProductAttributeItemValVo.attrItem::new)
                        .collect(Collectors.toList()));
            result.add(vo);
        });

//        result.forEach(r -> {
//            if (CollectionUtils.isEmpty(r.getVals())) {
//                ProductAttribute attr = productAttributeService.getById(r.getAttrId());
//                if ("固定值".equals(attr.getType()) && StringUtils.isNotEmpty(attr.getValues())) {
//                    r.setVals(dictTypeService.selectDictDataByType(attr.getValues()).stream()
//                            .map(a -> new ProductAttributeItemValVo.attrItem(a.getDictValue(), a.getDictLabel(), "Y".equals(a.getIsDefault())))
//                            .collect(Collectors.toList()));
//                }
//            }
//        });

        return result;
    }
}
